1. Назначение
MotorStep V9.2 — прошивка для управления поворотным столом на шаговом моторе через драйвер TB6600. Предназначена для производственных задач, где требуется:
- Точное позиционирование стола в диапазоне 0…360°
- Плавное движение (трапециевидный профиль скорости) для тяжёлых столов (50–1500 кг)
- Автоматический поиск нуля (концевик) при старте
- Контроль точности через внешний энкодер MBL3806 (MISMATCH)
- Авто-выравнивание по внешнему энкодеру (AutoMove)
- Ручное управление через энкодер HW-040 и кнопки
- Внешнее управление через Serial (Console) и Wi-Fi (Web UI)
MotorStep_v9.ino.
2. Возможности V9.2
🌐 Wi-Fi AP
ESP32 создаёт точку доступа. SSID и пароль настраиваются из консоли, хранятся в NVS.
🖥️ Web UI
Полный интерфейс: управление, индикация, плавность, контроль точности, лог.
📡 WebSocket
JSON-статус раз в секунду. Реальное время.
🎯 Точность
0.1° по MBL3806 (24000 импульсов на оборот стола при GEAR_RATIO=10).
⚡ Плавность
Трапеция: разгон, плато, торможение. Настройка через Web/Console.
🛡️ Контроль точности
Сравнение STEP ↔ MBL3806. При рассинхроне — STOP + мигание.
🎯 AutoMove
Досыл по внешнему энкодеру после остановки. Точность до 0.1°.
🏠 Поиск нуля
2 шага: пауза → отход → точный подход. Escape-зона при выходе из 0°/360°.
🛑 Мгновенный stop
Остановка за один шаг. Позиция сохраняется. STOP! — с освобождением мотора.
📟 Дисплей TM1637
Цель, угол стола, MBL3806. Режимы d1/d2. Run, EROR, BLOC/OFF, MISMATCH.
💾 NVS-память
step, findHome, accel/cruise/start, useTol, tolX10, autoMove, ssid, pass.
⚙️ Config.h
Все константы проекта в одном файле.
3. Подключение элементов
3.1. Карта пинов
| GPIO | Функция | Что подключено | Примечание |
|---|---|---|---|
0 | EncoderHW040 CLK | HW-040 CLK | ISR, CHANGE |
1 | EncoderHW040 DT | HW-040 DT | ISR, CHANGE |
2 | Кнопка дисплея | Кнопка (на GND) | Strapping — свой опрос |
3 | EncoderHW040 SW | HW-040 SW | GyverButton |
4 | TM1637 CLK | Дисплей TM1637 | — |
5 | TM1637 DIO | Дисплей TM1637 | — |
6 | TB6600 STEP | TB6600 PUL+ | Импульсы шага |
7 | TB6600 DIR | TB6600 DIR+ | Направление |
8 | Концевик HOME | Механический/индуктивный | INPUT_PULLUP, LOW = сработал |
9 | Резерв | — | Свободен |
10 | TB6600 ENA | TB6600 ENA+ | LOW = мотор включён |
20 | MBL3806 A | MBL3806 A | UART0 RX — 1 кОм, INPUT_PULLUP |
21 | MBL3806 B | MBL3806 B | UART0 TX — 1 кОм, INPUT_PULLUP |
3.2. Схема соединений
TB6600
ESP32-C3 TB6600
─────────────────────────────
GPIO 6 ──── 1кОм ──── PUL+ (STEP)
GPIO 7 ──── 1кОм ──── DIR+
GPIO 10 ──── 1кОм ──── ENA+
GND ────────────── PUL- / DIR- / ENA- (общий)
MBL3806
ESP32-C3 MBL3806
─────────────────────────────
+5V ────────────── VCC (красный)
GND ────────────── GND (чёрный)
GPIO 20 ──── 1кОм ──── A (зелёный)
GPIO 21 ──── 1кОм ──── B (белый)
HW-040
ESP32-C3 HW-040
─────────────────────────────
+3.3V ────────────── VCC
GND ────────────── GND
GPIO 0 ────────────── CLK
GPIO 1 ────────────── DT
GPIO 3 ────────────── SW (кнопка)
TM1637
ESP32-C3 TM1637
─────────────────────────────
+5V ────────────── VCC
GND ────────────── GND
GPIO 4 ────────────── CLK
GPIO 5 ────────────── DIO
Кнопка дисплея
ESP32-C3
─────────────────────────────
GPIO 2 ──[Кнопка]── GND
Концевик HOME
ESP32-C3
─────────────────────────────
GPIO 8 ──[Концевик NO]── GND
3.3. Питание
| Потребитель | Напряжение | Ток | Источник |
|---|---|---|---|
| ESP32-C3 Mini | 5 В (USB) | ~250 мА | USB или БП |
| TB6600 (логика) | 5 В | ~20 мА | БП 5 В |
| TB6600 (мотор) | 24–48 В | до 3 А | Отдельный БП |
| MBL3806 | 5 В | ~50 мА | БП 5 В |
| TM1637 | 5 В | ~30 мА | БП 5 В |
| HW-040 | 3.3 В | ~5 мА | ESP32 |
4. Настройки
4.1. Пины и механика
| Класс | Файл | Что настраивается |
|---|---|---|
| Display | Display.cpp | PIN_CLK_DISP=4, PIN_DIO_DISP=5 |
| Buttons | Buttons.cpp | PIN_ENC_SW=3, PIN_DISP_BTN=2, PIN_HOME=8 |
| EncoderHW040 | EncoderHW040.cpp | PIN_ENC_CLK=0, PIN_ENC_DT=1 |
| Position | Position.cpp | PIN_MBL_A=20, PIN_MBL_B=21 |
| Motor | Motor.cpp | PIN_STEP=6, PIN_DIR=7, PIN_ENA=10 |
| WebUI | WebUI.cpp | HTTP 80, WebSocket 81 |
| Все константы | Config.h | Механика, плавность, homing, escape, MISMATCH, AutoMove, энкодер, Wi-Fi |
Config.h — все параметры
// МЕХАНИКА
#define STEPS_PER_REV 800
#define GEAR_RATIO 10.0f
#define ANGLE_MIN 0
#define ANGLE_MAX 360
// ПЛАВНОСТЬ
#define DEFAULT_ACCEL_STEPS 1000
#define DEFAULT_CRUISE_DELAY_US 400
#define DEFAULT_START_DELAY_US 1000
// HOMING
#define HOME_FAST_DELAY_US 8000
#define HOME_SLOW_DELAY_US 32000
#define HOME_BACKOFF_STEPS 50
#define HOME_PAUSE_MS 1000
// ESCAPE
#define ESCAPE_ZONE_DEG 5
// MISMATCH
#define MISMATCH_CHECK_MOVING_MS 500
#define MISMATCH_CHECK_STOP_MS 1000
#define DEFAULT_TOLERANCE_X10 10
#define TOLERANCE_MIN_X10 1
#define TOLERANCE_MAX_X10 20
// AUTOMOVE
#define AUTOMOVE_TOLERANCE_X10 1
#define AUTOMOVE_INERTIA_MS 50
#define AUTOMOVE_TIMEOUT_MS 30000
#define AUTOMOVE_CHECK_MS 100
#define AUTOMOVE_MAX_ATTEMPTS 20
4.2. NVS (энергонезависимая память)
Namespace "motorstep":
| Ключ | Тип | Дефолт | Что значит |
|---|---|---|---|
step | int | 5 | Текущий шаг (1..360°) |
findHome | bool | true | Искать ноль при старте |
accel | int | 1000 | Шагов на разгон/торможение |
cruise | int | 800 | Задержка на плато (мкс) |
start | int | 5000 | Задержка на старте/стопе (мкс) |
useTol | bool | false | Контроль точности |
tolX10 | int | 10 | УТ ×10 (0.1..2.0°) |
autoMove | bool | false | Авто-выравнивание по энкодеру |
ssid | string | "MotorStep" | Имя Wi-Fi AP |
pass | string | "newpribor" | Пароль Wi-Fi AP |
5. Console (Serial)
Скорость: 115200. Line Ending: Newline или Both NL & CR.
5.1. Команды
| Команда | Что делает | Ответ |
|---|---|---|
move <angle> | Перейти к углу (0..360) | OK / BUSY |
home | Поиск нуля | OK |
reset | Сброс позиции в 0 | OK |
hold | Удержание/освобождение мотора | OK |
stop | Мгновенный стоп (без сбросов) | OK |
stop! | Стоп с ошибкой (мотор освобождён) | OK |
clear | Сброс ошибки (позиция сохраняется) | OK |
next | Следующий шаг (180→90→10→5→1→180) | OK |
setstep <n> | Установить шаг 1..360 (NVS) | OK |
accel <n> | Установить accel (NVS) | OK |
cruise <n> | Установить cruise (NVS) | OK |
start <n> | Установить start (NVS) | OK |
ut <n> | Установить УТ ×10 (1..20) | OK |
usetol <0|1> | Вкл/выкл контроль точности | OK / BUSY |
usetol | Переключить контроль | OK / BUSY |
automove <0|1> | Авто-выравнивание по энкодеру | OK |
findhome <0|1> | Поиск нуля при старте (NVS) | OK |
ssid <name> | Задать SSID Wi-Fi AP (1..31) | OK / ERROR |
pass <password> | Задать пароль Wi-Fi AP (8..63) | OK / ERROR |
pass off | Открытая сеть | OK |
reboot | Перезагрузка (применить Wi-Fi) | — |
save | Сохранить всё в NVS | OK / BUSY |
load | Загрузить всё из NVS | OK / BUSY |
hb <0|1> | Heartbeat вкл/выкл | OK |
help | Список команд | OK + help |
5.2. Запросы
| Команда | Ответ |
|---|---|
ready? | READY / BUSY |
status? | IDLE / MOVING |
angle? | Целевой угол (0..360) |
motor? | Угол мотора (199.0) |
mbl? | Угол MBL3806 (199.0) |
step? | Текущий шаг (1..360) |
error? | OK / ERROR |
hold? | ON / OFF |
hb? | ON / OFF |
ut? | УТ ×10 (1..20) |
usetol? | ON / OFF |
automove? | ON / OFF |
findhome? | ON / OFF |
ssid? | Текущий SSID |
pass? | Длина пароля (0..63) |
accel? / cruise? / start? | Значение параметра |
Асинхронные события
| Событие | Когда |
|---|---|
DONE | Мотор завершил движение (с учётом AutoMove) |
READY | Контроллер свободен |
HB | Heartbeat (если включён) |
6. Web UI (Wi-Fi)
6.1. Подключение
- Прошейте плату
- Подключитесь к Wi-Fi: SSID/пароль из NVS (по умолчанию
MotorStep/newpribor) - Откройте
http://192.168.4.1/ - Индикатор ONLINE — соединение установлено
6.2. Блоки интерфейса
📊 Индикатор
| Поле | Что показывает |
|---|---|
| Задано | Целевой угол |
| Факт (энкодер) | Угол MBL3806 (199.0) |
| Статус | ГОТОВ / ДВИЖЕНИЕ |
| Ошибка | НЕТ / ОШИБКА |
| Удержание | ДА / НЕТ |
| Шаг | 1..360° |
📏 Шаг
- ◀ НАЗАД / NEXT STEP / ВПЕРЁД ▶
🎛️ Управление
- Поле угла + ПЕРЕЙТИ
- 🏠 — HOME
- STOP, СБРОС, HOLD
- STOP!, CLEAR
⚡ Плавность
- accel / cruise / start + ПРИМЕНИТЬ
🛡️ Контроль точности (УТ)
- Поле УТ (0.1..2.0) + ПРИМЕНИТЬ
- Чекбокс «Использовать контроль»
- Чекбокс «Авто-выравнивание по энкодеру»
- Автосинхронизация из JSON
📜 Лог событий
- Последние 50 сообщений
8. Дисплей TM1637
Режимы
| Режим | Индикатор | Формат | Что показывает |
|---|---|---|---|
| d1 | d 1 | XXX | Угол стола |
| d2 | d 2 | _XXX | Угол MBL3806 |
Приоритет отображения
- EROR — мигает
- MISMATCH — мигает углом энкодера
- Run — во время движения
- S XX — 1 сек
- BLOC / OFF — 1 сек
- d1 / d2 — 1 сек
- Цель — 1 сек
- Угол
Яркость
Настраивается в setup() через display.setBrightness(b):
| Значение | Яркость | Когда использовать |
|---|---|---|
| 0x0f | 100% | Максимум |
| 0x0b | ~75% | День (сейчас) |
| 0x04 | ~25% | Ночью |
| 0x01 | ~5% | Минимум |
9. Компиляция
9.1. Плата
| Параметр | Значение |
|---|---|
| Board | ESP32C3 Dev Module |
| Чип | ESP32-C3 |
| Плата | ESP32-C3 Mini V1 |
9.2. Библиотеки
| Библиотека | Автор | Для чего |
|---|---|---|
| TM1637Display | Avishay Orpaz | Дисплей |
| GyverButton | AlexGyver | SW энкодера |
| WebSockets | Markus Sattler | WebSocket-сервер |
9.3. Настройки Arduino IDE
| Настройка | Значение | Почему |
|---|---|---|
| Board | ESP32C3 Dev Module | Правильный чип |
| USB CDC On Boot | Enabled | Serial через USB |
| CPU Frequency | 160 MHz | Скорость |
| Flash Size | 4MB (32Mb) | Стандарт |
| Upload Speed | 921600 | Быстрая прошивка |
| JTAG Adapter | Disabled | Не занимает GPIO 0-5 |
| USB DFU On Boot | Disabled | Не нужно |
Serial.setTxTimeoutMs(0) вызовет ошибку компиляции.
9.4. Прошивка
- Подключить ESP32-C3 через USB
- Tools → Port
- Upload (Ctrl+U)
- Если не прошивается: BOOT → RESET → отпустить RESET → отпустить BOOT → Upload
- После прошивки — RESET
10. Известные проблемы и особенности
Плавность vs Wi-Fi
webui.update() раз в 20 мс (не каждый loop).
Пропуски энкодера HW-040
Антидребезг 2000 мкс в ISR + REPORT_MIN_INTERVAL_MS = 50 мс.
Двойное срабатывание GPIO 2
Strapping-пин. State machine в Buttons.cpp, антидребезг 50 мс.
GPIO 20/21 (UART0)
Serial использует USB CDC, MBL3806 работает без конфликтов.
Стол долго доводит угол при AutoMove
Нормально — система досылает до 0.1°. Если слишком медленно — увеличьте ut или отключите AutoMove.
11. Проверено и однозначно не работает
| Что | Результат | Причина |
|---|---|---|
| GyverButton на GPIO 2 | НЕ работает | Strapping. Заменено на state machine. |
| GyverEncoder на ESP32-C3 | НЕ работает | Под AVR/ESP8266. Заменено на ISR-декодер. |
| Точка на TM1637 | НЕ работает | Заменено на _ перед числом для MBL. |
| PROGRESS каждые 1° | НЕ работает плавно | Serial блокирует loop. |
| webui.update() каждый loop | НЕ работает плавно | Wi-Fi стек ест время. |
12. Состав проекта
MotorStep_v9/
├── MotorStep_v9.ino ← main
├── Config.h ← все константы
├── MainState.h / .cpp ← флаги main (V9.2)
├── Display.h / .cpp ← TM1637
├── Buttons.h / .cpp ← HW-040 SW + GPIO 2 + концевик
├── EncoderHW040.h / .cpp ← HW-040 (ISR)
├── Settings.h / .cpp ← NVS
├── Position.h / .cpp ← MBL3806
├── Motor.h / .cpp ← шаговый мотор
├── Console.h / .cpp ← Serial-протокол
└── WebUI.h / .cpp ← Wi-Fi AP + HTTP + WebSocket
13. История версий
| Версия | Что нового |
|---|---|
| V6 | Классовая архитектура, Console, NVS, GEAR_RATIO, d1/d2, Run, EROR, findHome с 4 этапами |
| V8 | WebUI (Wi-Fi AP + HTTP + WebSocket), JSON-статус, шаг как число, findHome с паузой, stop без сбросов |
| V9 | Контроль точности (MISMATCH), УТ, escape-зона, поиск нуля в 2 шага, команда findhome, настройки во время движения, stop/clear без сброса позиции, новый режим дисплея MISMATCH |
| V9.1 |
• Мгновенный DONE/READY при move на текущий угол• Motor::moveTo возвращает bool• Флаг _sendDonePending в main• Escape-зона: порог увеличен с 1° до 5° • Настройка Wi-Fi AP через консоль: ssid, pass, pass off, reboot• SSID и пароль сохраняются в NVS |
| V9.2 |
• AutoMove — досыл по внешнему энкодеру после остановки мотора • MainState — все флаги в одном классе• X10 точность для углов: motor?/mbl? → "199.0"• moveTo возвращает bool, мгновенный DONE на текущем угле• Все константы в Config.h• moveStepsSlow — медленные шаги для досыла• syncToEncoder — синхронизация мотора с энкодером• Яркость дисплея: 0x0b (день), 0x04 (ночь)• AUTOMOVE_INERTIA_MS = 50 — быстрое реагирование
|
14. Контроль точности (MISMATCH)
Сравнение угла по STEP-импульсам с углом внешнего энкодера MBL3806. При расхождении больше УТ — сигнал о пропуске шагов.
14.1. Настройки
| Параметр | Значение | Где меняется |
|---|---|---|
useTol | 0 / 1 | Консоль usetol, Web UI, NVS |
tolX10 | 1..20 (0.1°..2.0°) | Консоль ut, Web UI, NVS |
14.2. Проверки
Во время движения — каждые 500 мс
- Если
diff × 10 > tolX10→ STOP + мигание.
После остановки — через 1000 мс
- Если
diff > 0→ мигание.
14.3. Сброс MISMATCH
home— после успешного поиска нуляreset— сброс позицииCLEAR— не сбрасывает
14.4. Индикация
- Дисплей мигает углом энкодера, 300 мс
- Приоритет: EROR → MISMATCH → Run
15. Escape-зона при старте из 0°/360°
Если стол в зоне концевика и получает команду ехать от него — защита не должна срабатывать сразу.
15.1. Как работает
- При
moveTo()определяется: стоим в зоне 0°/360°, замкнут концевик, едем от него. - Флаг
_escapeZone = true. - Пока флаг активен — концевик игнорируется.
- Выход:
- концевик разомкнулся — OK;
- пройдено ESCAPE_ZONE_DEG (5°), а концевик замкнут — ERROR.
15.2. Порог — 5°
Индуктивный концевик имеет широкую зону. 5° (≈110 шагов) достаточно для уверенного выхода. Настраивается в Config.h:
#define ESCAPE_ZONE_DEG 5
16. Поиск нуля — два шага
16.1. Шаг 1 — быстрый поиск
- Запускается, если концевик не замкнут.
- Мотор едет в минус, 8000 мкс/шаг.
- Концевик замкнулся — переход к шагу 2.
16.2. Шаг 2 — пауза + отход + подход
- Пауза 1 сек.
- Отход в плюс до размыкания.
- +50 шагов.
- Медленный поиск в минус, 32000 мкс/шаг.
- Обнуление:
_currentStepPos = 0,_absAngle = 0.
16.3. Концевик замкнут при старте
Шаг 1 пропускается. Сразу шаг 2: пауза → отход → подход.
16.4. Защита по углу
Если пройдено больше STEPS_PER_REV × GEAR_RATIO + 200 — HOME_ERROR.
16.5. Команда findhome <0|1>
Управляет поиском нуля при старте. Сохраняется в NVS. Дефолт — 1.
17. Новые команды консоли
17.1. Команды
| Команда | Что делает | Ответ |
|---|---|---|
ut <n> | УТ ×10 (1..20) | OK |
usetol <0|1> | Вкл/выкл контроль точности | OK / BUSY |
usetol | Переключить | OK / BUSY |
automove <0|1> | Авто-выравнивание по энкодеру | OK |
findhome <0|1> | Поиск нуля при старте | OK |
hb <0|1> | Heartbeat | OK |
17.2. Запросы
| Запрос | Ответ |
|---|---|
ut? | 1..20 |
usetol? | ON / OFF |
automove? | ON / OFF |
findhome? | ON / OFF |
17.3. Правила вызова
ut,automove,findhome,hb— работают всегда.usetol— BUSY приautomove = ON.- Тяжёлые (
move,home,reset,hold,next,setstep,accel,cruise,start,save,load) — только когда мотор свободен. stop,stop!,clear,help— работают всегда.
18. stop / stop! / clear / reset
| Команда | Останавливает | Сбрасывает позицию | Ставит ошибку | Синхронизирует цель |
|---|---|---|---|---|
stop | да | нет | нет | да |
stop! | да | нет | да | да |
clear | нет | нет | снимает | нет |
reset | да | да | снимает | да (=0) |
home | да | после успеха | при провале | да (=0) |
19. Список доработок
19.1. Web UI — блок «Контроль точности»
СДЕЛАНО в V9
19.2. Web UI — индикация MISMATCH
ОТЛОЖЕНО
19.3. Web UI — яркость дисплея (слайдер)
ОТЛОЖЕНО
19.4. Расширенные тесты
ОТЛОЖЕНО
19.5. Wi-Fi из консоли
СДЕЛАНО в V9.1
19.6. Мгновенный DONE/READY
СДЕЛАНО в V9.1
19.7. Escape-зона 5°
СДЕЛАНО в V9.1
19.8. AutoMove
СДЕЛАНО в V9.2
19.9. MainState
СДЕЛАНО в V9.2
20. История V9 (включая V9.1)
| Раздел | Что нового |
|---|---|
| Контроль точности | MISMATCH, УТ, useTol, JSON, Web UI, сброс только home/reset |
| Escape-зона | Игнорирование концевика при выходе из 0°/360°. Порог 5° |
| Поиск нуля | 2 шага, пауза перед отходом, пропуск шага 1, команда findhome |
| Команды | Настройки во время движения, обновлён help |
| Motor | stop, stop!, clear не сбрасывают позицию; reset сбрасывает всё; moveTo возвращает bool |
| Display | Новый режим MISMATCH; приоритет EROR → MISMATCH → Run |
| Wi-Fi | ssid/pass/reboot из консоли, хранение в NVS |
| DONE/READY | Мгновенная отправка при move на текущий угол |
21. V9.1 — что нового
21.1. Мгновенный DONE/READY при совпадении угла
Команда move X, когда стол уже на X, ранее приводила к таймауту.
Решение:
Motor::moveToвозвращаетbool.- При
false— main ставит_sendDonePending = true. - В блоке DONE/READY:
if ((lastBusy && !doneBusy) || _sendDonePending).
21.2. Escape-зона: порог 5°
Индуктивный концевик имеет широкую зону срабатывания. Порог в Config.h:
#define ESCAPE_ZONE_DEG 5
21.3. Настройка Wi-Fi из консоли
ssid <name>— имя (1..31 симв.).pass <password>— пароль (8..63 симв.).pass off— открытая сеть.reboot— перезагрузка для применения.
22. Настройка Wi-Fi AP
22.1. Алгоритм смены сети
- Подключиться к COM-порту (115200) — Serial Monitor.
- Ввести
ssid НовоеИмяиpass НовыйПароль. - Ввести
reboot— плата перезагрузится. - После перезагрузки точка доступа создаётся с новыми параметрами.
22.2. Если забыл пароль
Настройки в NVS. Сброс — только перепрошивка. Дефолты:
- SSID:
MotorStep - Пароль:
newpribor
22.3. Ограничения
| Параметр | Мин | Макс | Примечание |
|---|---|---|---|
| SSID | 1 | 31 | IEEE 802.11 |
| Пароль | 8 | 63 | WPA2-PSK, ASCII |
23. AutoMove — авто-выравнивание по энкодеру
Функция доводит стол до целевого угла по внешнему энкодеру MBL3806. Работает после обычного движения мотора (по шагам).
23.1. Как работает
move X— мотор едет к цели по шагам.- Мотор остановился. Ждём
AUTOMOVE_INERTIA_MS(50 мс) — инерция стола. - Читаем энкодер:
diff = target − pos. - Три случая:
|diff| ≤ 0.1°— цель достигнута →DONE.|diff| ≤ tolerance— мелкая подстройка:moveStepsSlowс постоянным медленным интервалом.|diff| > tolerance— большое расхождение:syncToEncoder+ обычныйmoveTo.
- После каждого досыла — снова проверка. До достижения или таймаута.
23.2. Параметры (Config.h)
| Параметр | Значение | Что значит |
|---|---|---|
AUTOMOVE_TOLERANCE_X10 | 1 | Порог «достигли» — 0.1° |
AUTOMOVE_INERTIA_MS | 50 | Пауза после остановки, мс |
AUTOMOVE_TIMEOUT_MS | 30000 | Общий таймаут, мс |
AUTOMOVE_CHECK_MS | 100 | Период проверки |
AUTOMOVE_MAX_ATTEMPTS | 20 | Макс. число попыток |
23.3. Команда
automove <0|1> — вкл/выкл
automove? — запрос (ON / OFF)
23.4. Взаимодействие с MISMATCH
При automove = ON — usetol автоматически выключается.
Толерантность (УТ) при automove = ON используется как порог между мелкой подстройкой и большим движением.
23.5. Пример
automove 1
ut 10 # УТ = 1.0° — порог большой/мелкой подстройки
move 90 # мотор 0→90, потом autoMove досылает до 90.0
23.6. Блокировки
- Пока
automove = ON:move,home,reset,hold,usetol— BUSY.ut,automove,hb,stop,stop!,clear— работают всегда.
23.7. Результаты теста
При торможении рукой (accel=1000, cruise=200):
| Режим | Средняя ошибка | MAX |
|---|---|---|
| AutoMove OFF | 0.07° | 0.1° |
| AutoMove ON | 0.02° | 0.1° |
24. V9.2 — что нового
24.1. AutoMove
Автоматический досыл стола до точного угла по внешнему энкодеру. Подробно — раздел 23.
24.2. MainState — флаги в одном классе
Все флаги main собраны в MainState.h/.cpp. Логика переходов внутри класса:
setWasMoving(v)— при false→true сбрасывает MISMATCH.setAutoMoveActive(v)— при false→true стартует таймер.setAutoMoveMotorStopped(v)— при false→true стартует таймер инерции.setTargetAngle(a)— при изменении сбрасывает autoMove.
24.3. X10 точность для углов
Углы motor?/mbl? возвращаются строкой "199.0" (1 знак после точки). Внутри — X10.
getAngleX10()— X10 (0..3600) для расчётов.getAngleDeg()— целые с округлением для дисплея.getAngle()— удалён.
24.4. Мгновенный DONE на текущем угле
- automove = OFF:
a == motor.getAngleDeg()→ DONE. - automove = ON:
|a×10 − position.getAngleX10()| ≤ AUTOMOVE_TOLERANCE_X10→ DONE.
24.5. Config.h
Все числовые параметры — в Config.h. Менять только там.
24.6. Яркость дисплея
В setup():
//display.setBrightness(0x0f); // максимум
display.setBrightness(0x0b); // день
//display.setBrightness(0x04); // ночью
24.7. Motor — новые методы
bool moveTo(int32_t)— возвращает false, если уже на месте.bool moveStepsSlow(int32_t)— медленные шаги.void syncToEncoder(int32_t)— синхронизация с энкодером.getAngleX10()/getAngleDeg().
24.8. Автотест — точность OFF vs ON
motorstep_autotest.py — флаг --accuracy-step N (20° по умолчанию). Прогон круга 0..360 дважды (OFF/ON), сравнение точности. --skip-accuracy — пропустить.